/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.freezer.vixapi;

import java.io.IOException;
import java.util.Vector;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.freezer.vixapi.interfaces.VixController;

/**
 * Implementálja a VixController interfészt. Vezérelni fogja a vmrun programot.
 * @author Zoli
 */
public class Vix implements VixController {

    private static Logger logger = Logger.getLogger("VixController");
    private static FileHandler handler;

    private Property vp;
    private CommandExecutor ce;
    private int exitValue;

    Vix(Property vp) throws IOException{
        super();
        handler = new FileHandler("Vix.log.txt");
        logger.addHandler(handler);
        
        this.vp = vp;

        ce = new CommandExecutor();
    }
    /**
     *
     * Ennek a fealdata, hogy felépítse a kapcsolódáshoz
     * szükséges alap sztringet.
     * Például:
     * vmrun -T server -h https://10.0.1.8/sdk -u root -p <pass> 
     */
    private String getConnectionString(){
        //String cmd = "vmrun ";
        String cmd = "C:\\VMwareVIX\\vmrun ";
        String param = "-T server -h ";
        return cmd+param+vp.getUrl()+" -u "+vp.getUser()+" -p "+vp.getPassword();
    }
    /**
     *
     * Run console command.
     */
    private void runCommand(String command){
        String cmd =
                this.getConnectionString()+" "+command+" "+vp.getMachineName();
        Logger.getLogger("Vix.runCommand").log(Level.INFO, cmd);
        

        ce = new CommandExecutor();
        ce.runCommand(cmd);
        
    }

    public Vector lists() {
        String command = "list";
        ce.runCommand(this.getConnectionString() + " " +command);
        this.setExitValue(ce.getExitValue());
        if(ce.getExitValue() != -1){
            //Az output egy enterrel elválasztott String sorozat.
            //Szétvágjuk, mert minden vm neve külön sorban jelenik meg.
            String[] test = ce.getGetOutMessage().split("\r\n");
            Vector v = new Vector();
            //Az első sorra nincs szükségünk, az csak summary infomráció.
            for(int i=1;i<=test.length-1;i++){
                v.add(test[i]);
            }
            return v;
        }else
            return null;
    }

    public void start() {
        // TODO: Megírni a list mintájára !!
        String command = "start";
        runCommand(command);
        this.setExitValue(ce.getExitValue());
    }

    public void stop() {
        // TODO: Megírni a list mintájára !!
        String command = "stop";
        runCommand(command);
        this.setExitValue(ce.getExitValue());
    }

    public void suspend() {
        // TODO: Megírni a list mintájára !!
        String command = "pause";
        runCommand(command);
        this.setExitValue(ce.getExitValue());
    }

    public void resume() {
        // TODO: Megírni a list mintájára !!
        String command = "unpause";
        runCommand(command);
        this.setExitValue(ce.getExitValue());
    }

    public void takeSnapshot() {
        // TODO: Megírni a list mintájára !!
        String command = "snapshot";
        runCommand(command);
        this.setExitValue(ce.getExitValue());
    }

    public void deleteSnapshot() {
        // TODO: Megírni a list mintájára !!
        String command = "deleteSnapshot";
        runCommand(command);
        this.setExitValue(ce.getExitValue());
    }

    /**
     * @return the exitValue
     */
    public int getExitValue() {
        return exitValue;
    }

    /**
     * @param exitValue the exitValue to set
     */
    public void setExitValue(int exitValue) {
        this.exitValue = exitValue;
    }
}
